package com.kerwin.entity.returnjson;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.util.List;

/*如何不返回null值*/
/*jackson组件，把AxiosResult对象转json字符串是，NULL不参与序列化*/
@JsonInclude(JsonInclude.Include.NON_NULL)


/*以后所有的Object都用泛型*/
/*泛型思路，在这里new 好了，外面直接调用*/
public class AxiosResultGenerics<T> {

    /*思想就是套*/
    /*在这里面套E属性 可以方便的指定  错误信息*/
    private Integer code;
    private String msg;

    /*以后所有的Object都用泛型*/
    /*能用泛型最好用泛型*/
    private T data;

    /**
     * 用泛型实现的方法
     * 定义一个统一的new 方法
     * 因为我这里new好了，外面就不要随便创建了
     * 私有化构造方法
     */
    /*私有化无参构造*/
    private AxiosResultGenerics(){};


    /*这个T是从上面传下来的*/
    /*第一层传给T data*/

    /*把这个newBean隐藏起来，外面根本不需要这个方法，一点出来就很难受*/
    private static <T> AxiosResultGenerics<T> newBean(E e,T data){
        AxiosResultGenerics<T> t = new AxiosResultGenerics<T>();
        t.setCode(e.getCode());
        t.setMsg(e.getMsg());
        t.setData(data);
        return t;
    }


    /**
     * 创建一个返回 成功
     * 自定义返回吗  自定义数据
     */
    public static <T> AxiosResultGenerics<T> SUC(E e,T data){
        return newBean(e, data);
    }


    /*我要在这里面加入一个返回带分页数据的  List的对象*/
    /*如果是普通的list，直接写就行，因为T是object*/
    public static AxiosResultGenerics<TableDate> SUC(E e, List t){
        return newBean(e,new TableDate(t));
    }

    /*返回成功的带有两个list的*/
    public static AxiosResultGenerics<TableDate> SUC(List t1,List t2){
        return newBean(E.SUC,new TableDate(t1,t2));
    }

    public static AxiosResultGenerics<TableDate> SUC(List t1){
        return newBean(E.SUC,new TableDate(t1));
    }

    /*创建一个返回错误异常信息的方法*/
    /*只返回错误码，不返回数据*/
    /*这个泛型些什么呢，老师是直接写的<T> 我也写吧，有问题再说*/

    public static  AxiosResultGenerics<Void> ERROR(E e){
        return newBean(e,null);
    }


    /*set get 方法*/

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
